www.gusucode.com > VC++ 三维图形生成和察看工具 > VC++ 三维图形生成和察看工具/code/mesh/Lib3D/ColorRamp.cpp

    //Download by http://www.NewXing.com
//********************************************
// ColorRamp.cpp
//********************************************
// alliez@usc.edu
// Created : 19/05/98
// Modified : 19/05/98
//********************************************

#include "stdafx.h"
#include "ColorRamp.h"

//********************************************
// Constructor
//********************************************
CColorRamp::CColorRamp()
{
	BuildDefault();
}

//********************************************
// Destructor
//********************************************
CColorRamp::~CColorRamp()
{
}

//********************************************
// Build
//********************************************
int CColorRamp::Build()
{
 int x1,y1,x2,y2;
 float a,b;
 ASSERT(m_NbNode >= 2);
 for(unsigned char k=0;k<3;k++)
	 for(int i=0;i<m_NbNode-1;i++)
   {
    x1 = (int)m_Node[i];
    x2 = (int)m_Node[i+1];

    ASSERT(x1<x2);
    y1 = m_Color[k][x1];
    y2 = m_Color[k][x2];

    a = (float)(y2-y1) / (float)(x2-x1);
    b = (float)y1 - a*(float)x1;

    for(int j=x1;j<x2;j++)
      m_Color[k][j]=(unsigned char)(a*(float)j+b);
   }
	return 1;
}

//********************************************
// Build
//********************************************
int CColorRamp::BuildNodes()
{
	// Check first and last are set
	m_Color[3][0] = 1;
	m_Color[3][m_Size-1] = 1;
	// Count nodes
	m_NbNode = 0;
	for(int i=0;i<m_Size;i++)
		if(m_Color[3][i]==1)
		{
			m_Node[m_NbNode]=(unsigned char)i;
			m_NbNode++;
		}
	TRACE("NbNode : %d\n",m_NbNode);
	ASSERT(m_NbNode>=2);
	return 1;
}

//********************************************
// ResetNodes
// Just first and last node
//********************************************
void CColorRamp::ResetNodes()
{
	for(int i=0;i<m_Size;i++)
		m_Color[3][i] = 0;
	m_Color[3][0] = 1;
	m_Color[3][m_Size-1] = 1;
	BuildNodes();
}

//********************************************
// BuildDefault
// 256 grey levels
//********************************************
void CColorRamp::BuildDefault()
{
	m_Size = 256;
	ResetNodes();

	// Grey scales
	for(unsigned char i=0;i<3;i++)
	{
		m_Color[i][0]=0;
		m_Color[i][255]=255;
	}
	Build();
}

//********************************************
// BuildDefault
// 256 grey levels
//********************************************
void CColorRamp::BuildRainbow()
{
	m_Size = 256;
	ResetNodes();

	// Rainbow
	m_Color[3][0] = 1;m_Color[0][0] = 0;m_Color[1][0] = 0;m_Color[2][0] = 255;
	m_Color[3][48] = 1;m_Color[0][48] = 0;m_Color[1][48] = 254;m_Color[2][48] = 255;
	m_Color[3][96] = 1;m_Color[0][96] = 0;m_Color[1][96] = 254;m_Color[2][96] = 0;
	m_Color[3][144] = 1;m_Color[0][144] = 255;m_Color[1][144] = 255;m_Color[2][144] = 0;
	m_Color[3][192] = 1;m_Color[0][192] = 255;m_Color[1][192] = 126;m_Color[2][192] = 0;
	m_Color[3][240] = 1;m_Color[0][240] = 255;m_Color[1][240] = 0;m_Color[2][240] = 0;
	m_Color[3][255] = 1;m_Color[0][255] = 255;m_Color[1][255] = 255;m_Color[2][255] = 255;

	BuildNodes();
	Build();
}

//********************************************
// Trace
//********************************************
void CColorRamp::Trace()
{
	TRACE("Ramp (%d elts)\n",m_Size);
	for(int i=0;i<m_Size;i++)
	{
		TRACE("  %3d %3d %3d\n",m_Color[0][i],m_Color[1][i],m_Color[2][i]);
	}
}

//** EOF **